package com.xwb.websocket;

import com.xwb.dao.MemberDao;
import com.xwb.domain.SupplyForUser;
import com.xwb.domain.User;
import com.xwb.service.MemberService;
import com.xwb.service.UserService;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndpoint("/invite")
@Component
public class MyWebSocketServer {
    // 创建一个Map来映射学号和WebSocket会话
    private static final Map<String, Session> studentSessions = new ConcurrentHashMap<>();
    @Autowired
    private MemberService memberService;
    @Autowired
    private UserService userService;
    @Autowired
    private MemberDao memberDao;

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket连接已打开");
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("WebSocket连接已关闭");
    }

    /**
     *传入一个json数据封装到message里
     * @param message json数据
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("Received message from " + session.getId() + ": " + message);

        try {
            // 使用JSON解析器解析接收到的JSON字符串
            JSONParser parser = new JSONParser();
            JSONObject json = (JSONObject) parser.parse(message);

            // 提取学号
            String studentId = (String) json.get("studentId");

            // 打印学号
            System.out.println("Student ID: " + studentId);

            // 将学号与WebSocket会话关联并存储在studentSessions中
            studentSessions.put(studentId, session);

            // 进行其他操作，例如将学号传递给WebSocket服务器
            handleStudentResponse(studentId, null,null,true); // 假设学生接受了邀请
        } catch (ParseException e) {
            e.printStackTrace();
            // 处理解析错误
        }
    }

    public void handleStudentResponse(String studentId,String teamName,String teamNumber, boolean accepted) {
        SupplyForUser supplyForUser = new SupplyForUser();
        supplyForUser.setTeamName(teamName);
        supplyForUser.setTeamNumber(teamNumber);
        if (accepted) {
            // 学生同意加入团队，在user表里查询是否有此人
            User user =  userService.selectByUserId(studentId);
            if (user != null) {
                // 假设在数据库中添加学生信息到团队表
                boolean flag = memberService.saveMember(user);
                //更新该学生的队伍号，队伍名，
                memberDao.supplyUserInfo(supplyForUser);

                // 向学生发送成功加入团队的消息
                String successMessage = "恭喜，您已成功加入团队！";
                sendMessageToClient(studentId, successMessage);

                // 可以继续添加其他处理逻辑，例如向学生发送其他消息
                String additionalMessage = "欢迎加入我们的团队，我们期待您的贡献！";
                sendMessageToClient(studentId, additionalMessage);

                // 执行其他操作，例如向团队成员发送通知等
//                notifyTeamMembers(student.getName() + " 已加入团队。");
            }
        } else {
            // 处理学生拒绝加入团队的情况
            // 您可以添加相应的拒绝处理逻辑，例如发送拒绝消息、记录拒绝信息等
            String rejectMessage = "加入失败，请联系邀请你的队长重新邀请！";
            sendMessageToClient(studentId, rejectMessage);

            // 可以继续添加其他拒绝处理逻辑
        }

        // 在处理完同意或拒绝的逻辑后，可以继续执行其他处理逻辑
        // 例如，向学生发送其他消息或执行其他操作
        String otherMessage = "其他消息或操作";
        sendMessageToClient(studentId, otherMessage);

        // 其他处理逻辑，例如向学生发送消息
    }


    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
    }


    /**
     * 把信息发送给该名邀请的学生
     */
    public static void sendMessageToClient(String studentId, String message) {
        Session session = studentSessions.get(studentId);
        if (session != null && session.isOpen()) {
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}


